package BitCreeekClient;

import BitCreekLib.Host;
import BitCreekLib.MetaInfo;

import java.io.IOException;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Hashtable;

/**
 * @author Ivan Litsvinenka & Emanuele Ricci
 *         Interfaccia di Download
 */
public interface IDownload {
    /**
     * Grandezza standard di ogni parte del torrent
     */
    static int PARTSIZE = 4096;
    static int MAXCONNECTIONS = 10;
    static int STARTCONNECTIONS = 5;


    /**
     * Salva la la parte(in bytes) del torrent scaricata sul rispettivo file
     *
     * @param bytes I rispettivi bytes della parte scaricata
     * @param index L'index della parte scaricata
     */
    public void storePart ( int bytes, byte[] index );

    /**
     * Ricava i bytes di una parte del torrent dal filesystem in base all'indice passato
     *
     * @param index L'index della parte del file da prendere
     * @return Array di bytes che rappresenta quella precisa parte
     */
    public byte[] recoverPart ( int index );

    /**
     * Crea una nuova istanza di Download partendo da un file locale
     *
     * @param localPath Il path del file locale da cui creare l'istanza
     * @throws Exception
     */
    public void torrentFormFile ( String localPath ) throws Exception;

    /**
     * Crea una nuova istanza di Download partendo dalle informazioni contenute nel oggetto MetaInfo
     *
     *
     * @param metaInfo Le informazioni necessarie per costruire l'istanza di Download
     * @param destinationPath Il path locale del file
     *
     */
    public void torrentFromMetaInfo ( MetaInfo metaInfo, String destinationPath );


    /**
     * Salva le MetaInfo relative al torrent su un file descriptor sul filesystem
     *
     * @param localPath Il path del file sul filesystem
     */
    public void saveMetaInfo ( String localPath );


    /**
     * Metodo utilizzato per far partire il download di un torrent e aggiornare lo stato delle parti possedute
     *
     * @throws RemoteException
     * @throws AlreadyBoundException
     */
    public void initDownload ();

    /**
     * Popola le Parti di Download da un file locale
     *
     * @throws java.io.IOException
     */
    public void updateLocalFileStatus () throws IOException;

    /**
     * Restituisce il progesso (download) relativo al torrent
     *
     * @return Il progresso effettuato su un torrent in percentuale
     */
    public int getProgress ();

    /**
     * Restituisce il nome del torrent
     *
     * @return Il nome del torrent
     */
    public String getName ();

    /**
     * Restituisce lo swarm relativo al torrent
     *
     * @return Lo swarm relativo al torrent
     */
    public Hashtable<Host, PeerInfo> getSwarm ();

    /**
     * Setta il nuovo swarm relativo al torrent
     *
     * @param newSwarm Il nuovo swarm da sostituire
     *
     */
	public void setSwarm(ArrayList<Host> newSwarm);

    /**
     * @return La rappresentazione sotto forma di stringa dell'istanza di Download
     */
    public String toString ();
}
